home *** CD-ROM | disk | FTP | other *** search
- ;/*
- sc DATA=NEAR OPTSIZE OPTIMIZE OPTGLOBAL NOSTKCHK NMINC STRMERGE STREQ MCCONS COMNEST IGNORE=73 WheelGrad.c
- slink from lib:c.o WheelGrad.o to WheelGrad lib lib:sc.lib lib:amiga.lib
- quit
- */
-
- /*
- (c) Copyright 1992-1999 Amiga, Inc. All rights reserved.
- The information contained herein is subject to change without notice,
- and is provided "as is" without warranty of any kind, either expressed
- or implied. The entire risk as to the use of this information is
- assumed by the user.
- */
-
- /*
- * WheelGrad.c - simple example of colorwheel and gradient slider
- *
- * Puts up a colorwheel and gradient slider and changes the gradient slider
- * color based on where the colorwheel knob is moved. This will get you
- * pointed in the right direction.
- *
- * The code will attempt to open the deepest possible screen by querying
- * the display database.
- */
-
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <intuition/intuition.h>
- #include <intuition/intuitionbase.h>
- #include <intuition/screens.h>
- #include <graphics/displayinfo.h>
- #include <intuition/gadgetclass.h>
- #include <gadgets/colorwheel.h>
- #include <gadgets/gradientslider.h>
- #include <dos/dos.h>
-
- #include <clib/intuition_protos.h>
- #include <clib/exec_protos.h>
- #include <clib/dos_protos.h>
- #include <clib/graphics_protos.h>
- #include <clib/colorwheel_protos.h>
-
- #include <stdio.h>
- #include <stdlib.h>
-
- #ifdef LATTICE
- int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */
- int chkabort(void) { return(0); } /* really */
- #endif
-
- struct Library *IntuitionBase = NULL;
- struct Library *GfxBase = NULL;
- struct Library *ColorWheelBase = NULL;
- struct Library *GradientSliderBase = NULL;
-
- struct load32
- {
- UWORD l32_len;
- UWORD l32_pen;
- ULONG l32_red;
- ULONG l32_grn;
- ULONG l32_blu;
- };
-
- void main(void)
- {
- struct Screen *Myscreen;
- struct Window *Mywindow;
- struct IntuiMessage *msg;
- struct Gadget *colwheel, *gradslid;
-
- #define GRADCOLORS 16 /* Set to 4 for ECS to ensure enough color wheel pens */
-
- ULONG colortable[96], mywinsig;
- struct load32 color_list[GRADCOLORS + 1];
- WORD penns[GRADCOLORS + 1];
- WORD i;
- BOOL Closeflag = FALSE;
- struct ColorWheelRGB rgb;
- struct ColorWheelHSB hsb;
- WORD numPens;
- ULONG modeID = HIRES_KEY;
- UWORD maxdepth;
- DisplayInfoHandle displayhandle;
- struct DimensionInfo dimensioninfo;
- ULONG gdidres;
- ULONG exitvalue = RETURN_FAIL;
-
- if (IntuitionBase = OpenLibrary("intuition.library",39))
- if (GfxBase = OpenLibrary("graphics.library",39))
- if (ColorWheelBase = OpenLibrary("gadgets/colorwheel.gadget",39L))
- if (GradientSliderBase=OpenLibrary("gadgets/gradientslider.gadget",39L))
- if (displayhandle = FindDisplayInfo(modeID))
- if (gdidres=GetDisplayInfoData(displayhandle,(UBYTE *) &dimensioninfo,
- sizeof(struct DimensionInfo),
- DTAG_DIMS,NULL))
- {
- maxdepth = dimensioninfo.MaxDepth;
-
- Myscreen = OpenScreenTags(NULL,
- SA_Depth, maxdepth,
- SA_SharePens, TRUE,
- SA_LikeWorkbench, TRUE,
- SA_Interleaved, TRUE,
- SA_Title, "WheelGrad Screen",
- TAG_DONE);
-
- if (Myscreen)
- {
- /* Get colors and set up gradient slider as color 0. */
-
- /* get the RGB components of color 0 */
- GetRGB32(Myscreen->ViewPort.ColorMap,0L,32L,colortable);
- rgb.cw_Red = colortable[0];
- rgb.cw_Green = colortable[1];
- rgb.cw_Blue = colortable[2];
-
- /* now convert the RGB values to HSB, and max out B component */
- ConvertRGBToHSB(&rgb,&hsb);
- hsb.cw_Brightness = 0xffffffff;
-
- numPens = 0;
- while (numPens < GRADCOLORS)
- {
- hsb.cw_Brightness = 0xffffffff - ((0xffffffff / GRADCOLORS) * numPens);
- ConvertHSBToRGB(&hsb,&rgb);
-
- penns[numPens] = ObtainPen(Myscreen->ViewPort.ColorMap,-1,
- rgb.cw_Red,rgb.cw_Green,rgb.cw_Blue,PEN_EXCLUSIVE);
- if (penns[numPens] == -1)
- break;
-
- /* Set up LoadRGB32() structure for this pen */
- color_list[numPens].l32_len = 1;
- color_list[numPens].l32_pen = penns[numPens];
- numPens++;
- }
- penns[numPens] = ~0;
- color_list[numPens].l32_len = 0;
-
- /* Create gradient slider and colorwheel gadgets */
- gradslid = (struct Gadget *)NewObject(NULL,"gradientslider.gadget",
- GA_Top, 50,
- GA_Left, 177,
- GA_Width, 20,
- GA_Height, 100,
- GA_ID, 1L,
- GRAD_PenArray, penns,
- PGA_Freedom, LORIENT_VERT,
- TAG_END);
-
- colwheel = (struct Gadget *)NewObject(NULL, "colorwheel.gadget",
- GA_Top, 50,
- GA_Left, 50,
- GA_Width, 120,
- GA_Height, 100,
- WHEEL_Red, colortable[0],
- WHEEL_Green, colortable[1],
- WHEEL_Blue, colortable[2],
- WHEEL_Screen, Myscreen,
- WHEEL_GradientSlider, gradslid, /* connect gadgets */
- GA_FollowMouse, TRUE,
- GA_Previous, gradslid,
- GA_ID, 7L,
- TAG_END);
-
-
- if (gradslid && colwheel)
- {
- if (Mywindow = OpenWindowTags(NULL, WA_Left, 10,
- WA_Top, 20,
- WA_Height, 200,
- WA_Width, 400,
- WA_Title, "WheelGrad Window",
- WA_CustomScreen, Myscreen,
- WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_MOUSEMOVE,
- WA_SizeGadget, TRUE,
- WA_DragBar, TRUE,
- WA_CloseGadget, TRUE,
- WA_Gadgets, gradslid,
- TAG_DONE))
- {
- mywinsig = 1 << Mywindow->UserPort->mp_SigBit;
-
- do
- {
- Wait(mywinsig);
-
- while (msg = (struct IntuiMessage *)GetMsg(Mywindow->UserPort))
- {
- switch (msg->Class)
- {
- case IDCMP_CLOSEWINDOW:
- Closeflag = TRUE;
- break;
- case IDCMP_MOUSEMOVE:
-
- /*
- * Change gradient slider color each time
- * colorwheel knob is moved. This is one
- * method you can use.
- */
-
- /* Query the colorwheel */
- GetAttr(WHEEL_HSB,colwheel,(ULONG *)&hsb);
-
- i = 0;
-
- while (i < numPens)
- {
- hsb.cw_Brightness =
- 0xffffffff - ((0xffffffff / numPens) * i);
- ConvertHSBToRGB(&hsb,&rgb);
-
- color_list[i].l32_red = rgb.cw_Red;
- color_list[i].l32_grn = rgb.cw_Green;
- color_list[i].l32_blu = rgb.cw_Blue;
- i++;
- }
- LoadRGB32(&Myscreen->ViewPort,(ULONG *)color_list);
- break;
- }
- ReplyMsg((struct Message *)msg);
- }
- }
- while (Closeflag == FALSE);
- }
- CloseWindow(Mywindow);
- }
-
-
- /* Get rid of the gadgets */
- DisposeObject(colwheel);
- DisposeObject(gradslid);
-
- /* Always release the pens */
- while (numPens > 0)
- {
- numPens--;
- ReleasePen(Myscreen->ViewPort.ColorMap,penns[numPens]);
- }
-
- CloseScreen(Myscreen);
- exitvalue = RETURN_OK;
- }
- else
- printf("Failed to open screen\n");
- }
-
- if (gdidres == 0)
- printf("Screen mode dimension information not available\n");
-
- if (displayhandle == NULL)
- printf("Failed to find HIRES_KEY in display database\n");
-
- if (GradientSliderBase)
- CloseLibrary(GradientSliderBase);
- else
- printf("Failed to open gadgets/gradientslider.gadget\n");
-
- if (ColorWheelBase)
- CloseLibrary(ColorWheelBase);
- else
- printf("Failed to open gadgets/colorwheel.gadget\n");
-
- if (GfxBase)
- CloseLibrary(GfxBase);
- else
- printf("Failed to open graphics.library\n");
-
- if (IntuitionBase)
- CloseLibrary(IntuitionBase);
- else
- printf("Failed to open intuition.library\n");
-
- exit(exitvalue);
- }
-